/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.kafka.clients.producer;

/**
 * A callback interface that the user can implement to allow code to execute when the request is complete. This callback
 * will generally execute in the background I/O thread so it should be fast.
 */
// 用户可以实现的回调接口，允许代码在请求完成时执行。
// 这个回调通常在后台I/O线程中执行，所以它应该很快。
public interface Callback {

    /**
     * A callback method the user can implement to provide asynchronous handling of request completion. This method will
     * be called when the record sent to the server has been acknowledged. When exception is not null in the callback,
     * metadata will contain the special -1 value for all fields. If topicPartition cannot be
     * choosen, a -1 value will be assigned.
     *
     * @param metadata The metadata for the record that was sent (i.e. the partition and offset). An empty metadata
     *                 with -1 value for all fields will be returned if an error occurred.
     * @param exception The exception thrown during processing of this record. Null if no error occurred.
     *                  Possible thrown exceptions include:
     *
     *                  Non-Retriable exceptions (fatal, the message will never be sent):
     *
     *                  InvalidTopicException
     *                  OffsetMetadataTooLargeException
     *                  RecordBatchTooLargeException
     *                  RecordTooLargeException
     *                  UnknownServerException
     *                  UnknownProducerIdException
     *                  InvalidProducerEpochException
     *
     *                  Retriable exceptions (transient, may be covered by increasing #.retries):
     *
     *                  CorruptRecordException
     *                  InvalidMetadataException
     *                  NotEnoughReplicasAfterAppendException
     *                  NotEnoughReplicasException
     *                  OffsetOutOfRangeException
     *                  TimeoutException
     *                  UnknownTopicOrPartitionException
     */
    // 用户可以实现的回调方法，以提供请求完成的异步处理。
    // 当发送到服务器的记录得到确认时，将调用此方法。
    // 当回调中的exception不为空时，元数据将包含所有字段的特殊值-1。
    // 如果topicPartition不能被选择，则分配一个-1的值。
    // 参数: metadata -发送的记录的元数据（即分区和偏移量）。
    // 如果发生错误，将返回所有字段值为-1的空元数据。
    // exception -在处理此记录期间抛出的异常。如果没有错误发生，则为空。
    // 可能抛出的异常包括：
    // 不可重试异常（致命的，消息将永远不会发送）：
    //      InvalidTopicException
    //      OffsetMetadataTooLargeException
    //      RecordBatchTooLargeException
    //      RecordTooLargeException
    //      UnknownServerException
    //      UnknownProducerIdException
    //      InvalidProducerEpochException
    // 可重试异常（暂时的，可能会增加#.retries）：
    //      CorruptRecordException
    //      InvalidMetadataException
    //      NotEnoughReplicasAfterAppendException
    //      NotEnoughReplicasException
    //      OffsetOutOfRangeException
    //      TimeoutException
    //      UnknownTopicOrPartitionException
    void onCompletion(RecordMetadata metadata, Exception exception);
}
